/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.eventos.beans;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.cip.esymons.eventos.adapaters.RutaCarpetaReporte;
import org.cip.esymons.eventos.bc.ConsejoDepartamentalDelegate;
import org.cip.esymons.eventos.bc.CursoDelegate;
import org.cip.esymons.eventos.bc.MatriculaDelegate;
import org.cip.esymons.eventos.bc.MatriculaAdapter;
import org.cip.esymons.eventos.bc.PreEventoDelegate;
import org.cip.esymons.eventos.be.Curso;
import org.cip.esymons.eventos.be.Matricula;
import org.cip.esymons.eventos.be.Preevento;
import org.cip.esymons.general.be.ConsejoDepartamental;
import org.cip.esymons.general.util.Utiles;

/**
 *
 * @author lizardo
 */
public class MatriculaController {
    private MatriculaDelegate delegado;

    private Matricula matricula;
    private MatriculaAdapter matriculaAdapter;
    List<MatriculaAdapter> listaMatricula;
    List<Matricula> listaSubsanacion;
    List<Matricula> listaAprobados;
    private String mensaje;
    private Integer codigoEvento;
    private String total;
    private String totalAprobados;
    private Double notaMinima;

    /*********************** Constructor de la clase *************************/
    public MatriculaController() {
        inicializar();
    }

    /*************************** Sets y Gettters *****************************/
    public Matricula getMatricula() {
        return matricula;
    }
    public void setMatricula(Matricula matricula) {
        this.matricula = matricula;
    }
    
    public MatriculaAdapter getMatriculaAdapter() {
        return matriculaAdapter;
    }
    public void setMatriculaAdapter(MatriculaAdapter matriculaAdapter) {
        this.matriculaAdapter = matriculaAdapter;
    }

    public List<MatriculaAdapter> getListaMatricula() {
        listar();
        return listaMatricula;
    }
    public void setListaMatricula(List<MatriculaAdapter> listaMatricula) {
        this.listaMatricula = listaMatricula;
    }

    public List<Matricula> getListaSubsanacion() {
        listarSubsanacion();
        return listaSubsanacion;
    }
    public void setListaSubsanacion(List<Matricula> listaSubsanacion) {
        this.listaSubsanacion = listaSubsanacion;
    }

    public Integer getCodigoEvento() {
       listar();
       return codigoEvento;
    }
    public void setCodigoEvento(Integer codigoEvento) {
        this.codigoEvento = codigoEvento;
    }

    public Double getNotaMinima() {
        mostrarNotaMinima();
        return notaMinima;
    }

    public void setNotaMinima(Double notaMinima) {
        this.notaMinima = notaMinima;
    }

    public MatriculaDelegate getDelegado() {
        return delegado;
    }
    
    public String getMensaje() {
        return mensaje;
    }
    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

    public List<Matricula> getListaAprobados() {
        listarAprobados();
        return listaAprobados;
    }
    public void setListaAprobados(List<Matricula> listaAprobados) {
        this.listaAprobados = listaAprobados;
    }

    public String getTotal() {
        return total;
    }
    public void setTotal(String total) {
        this.total = total;
    }

    public String getTotalAprobados() {
        return totalAprobados;
    }

    public void setTotalAprobados(String totalAprobados) {
        this.totalAprobados = totalAprobados;
    }


    
    /**************************** Metodos ************************************/
    public String inicializar() {
        codigoEvento = 0;
        matricula = new Matricula();
        delegado = new MatriculaDelegate();
        listaMatricula = new ArrayList<MatriculaAdapter>();
        listaAprobados = new ArrayList<Matricula>();
        total = "";
        totalAprobados = "";
        listar();
        return "";
    }

    public String listar() {
        //codigoEvento = cursoSeleccionado.getPreCodigo();
        System.out.print("Codigo Evento: " + codigoEvento);
        listaMatricula = delegado.listarMatriculaXEvento(codigoEvento);
        total = Utiles.totalRegistro(listaMatricula, "matrícula(s) en lista");
        return "listar";
    }

    public String cancelar() {
        codigoEvento = 0;
        matricula = new Matricula();
        //matriculaAdapter = new MatriculaAdapter();
        listaMatricula = new ArrayList<MatriculaAdapter>();
        listaAprobados = new ArrayList<Matricula>();
        listaSubsanacion = new ArrayList<Matricula>();
        return null;
    }

    public void listarSubsanacion() {
        listaSubsanacion = new ArrayList<Matricula>();
        mostrarSubsanacion();
    }

    public void listarAprobados() {
        try {
            listaAprobados = delegado.listarAprobadosXCurso(codigoEvento);
            totalAprobados = Utiles.totalRegistro(listaAprobados, "alumno(s) que aprobaron el curso/diplomado");
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En listar aprobados por curso", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
    }

    public void mostrarSubsanacion() {
        try {
            listaSubsanacion = delegado.listarMatriculaSubsanacion(codigoEvento);
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }

    public void mostrarNotaMinima() {
        try {
            CursoDelegate delegadoCurso = new CursoDelegate();
            codigoEvento = (codigoEvento == null) ? 0 : codigoEvento;
            notaMinima = delegadoCurso.getNotaMinima(codigoEvento);
//            delegadoCurso = null;
        } catch (Exception ex) {
            System.out.println("FATAL: " + ex.getMessage());
        }
    }

    public String guardarSubsanacion() {
        for (Matricula m : listaSubsanacion) {
            //Matricula mat = new Matricula();
            try {
                delegado.modificarMatricula(m);
                mostrarMensaje("INFO: ", "Se registró la subsanación con éxito ", FacesMessage.SEVERITY_INFO);
            } catch (Exception ex) {
                mostrarMensaje("Error: ", "No se guardo la nota subsanada ", FacesMessage.SEVERITY_ERROR);
                System.out.println("FATAL: " + ex.getMessage());
            }
        }
        mostrarSubsanacion();
        return null;
    }

//    public String actualizarPromedios() {
//        try {
//            List<Matricula> listaMatriculados = new ArrayList<Matricula>();
//            CalificacionModuloDelegate delegadoCalificacion = new CalificacionModuloDelegate();
//            listaMatriculados = delegado.listarMatriculadosXCurso(codigoEvento);
//            Curso c = new Curso();
//            CursoDelegate delegadoCurso = new CursoDelegate();
//            codigoEvento = (codigoEvento != null) ? codigoEvento : 0;
//            c = delegadoCurso.find(codigoEvento);
//            if (c != null) {
//                double notaMinima = c.getCurNotaMinima();
//                for (Matricula m : listaMatriculados) {
//                    long matCodigo = m.getMatCodigo();
//                    //metodo obsoleto se aplico native query mas abajo para resolver el problema
////                    double promedio = delegadoCalificacion.calcularPromedioCurso(codigoEvento, matCodigo);
//                    double promedio = delegadoCalificacion.calcularPromedioCurso_X_Alumno(codigoEvento, matCodigo);
//                    if (promedio >= notaMinima) {
//                        m.setMatestadoNota(2);  //aprobado
//                    } else {
//                        m.setMatestadoNota(1);  //desaprobado
//                    }
//                    m.setMatpromFinal(promedio);
//                    delegado.modificarMatricula(m);
//                }
//            } else {
//                mostrarMensaje("ERROR: ", "No hay Cursos/Diplomados...", FacesMessage.SEVERITY_ERROR);
//            }
//            c = null;
//            delegadoCurso = null;
//        } catch (Exception ex) {
//            mostrarMensaje("ERROR: ", "No se actualizaron los promedios de los alumnos, porque no se registraron sus notas o no actualizaron la nota mínima...", FacesMessage.SEVERITY_ERROR);
//            System.out.println("FATAL: " + ex.getMessage());
//        }
//        //return listar();
//        return null;
//    }

    public String actualizarPromedios() {
        String msg = null;
        try {
            Curso c = new Curso();
            CursoDelegate delegadoCurso = new CursoDelegate();
            codigoEvento = (codigoEvento != null) ? codigoEvento : 0;
            c = delegadoCurso.find(codigoEvento);
            if (c != null) {
                msg = delegado.actualizarPromedioCurso(codigoEvento);
                mostrarMensaje("AVISO: ", msg, FacesMessage.SEVERITY_WARN);
            } else {
                mostrarMensaje("ERROR: ", "No hay Cursos/Diplomados...", FacesMessage.SEVERITY_ERROR);
            }
            c = null;
            delegadoCurso = null;
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se actualizaron los promedios de los alumnos, porque no se registraron sus notas o no actualizaron la nota mínima...", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String eliminarInscripcion() {
        try {
            //matricula = delegado.find(matriculaAdapter);
            matricula = delegado.buscarXCodigo(matriculaAdapter.getCodigo());
            matricula.setMatEstado(new Integer(4));
            System.out.println("Mostrar datos: ");
            System.out.println("_______________________");
            System.out.println("codigo: \t" + matricula.getMatCodigo());
            System.out.println("fecha: \t" + matricula.getMatFecha());
            System.out.println("estado: \t" + matricula.getMatEstado());
            System.out.println("promedio final: \t" + matricula.getMatpromFinal());
            System.out.println("estado nota: \t" + matricula.getMatestadoNota());
            System.out.println("subsanacion: \t" + matricula.getMatSubsanacion());
            System.out.println("responsable: \t" + matricula.getMatObservacion());
            System.out.println("inhabilitado: \t" + matricula.getMatInhabilitado());
            System.out.println("_______________________");
            delegado.modificarMatricula(matricula);
            listar();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        return null;
    }

    @SuppressWarnings("static-access")
    public String exportar() {
        RutaCarpetaReporte ruta = new RutaCarpetaReporte();
        String rutaJasper = "", rutaPDF = "";
        String logoReporte = ruta.getRutaLogo();
        rutaJasper = ruta.getRutaReporte() + "rptMatriculados.jasper";
        rutaPDF = ruta.getRutaPDF() + "matriculados.pdf";
        try {
            ConsejoDepartamental consejo = new ConsejoDepartamental();
            ConsejoDepartamentalDelegate delegadoConsejo = new ConsejoDepartamentalDelegate();
            consejo = delegadoConsejo.buscarActivo();
            String nombreConsejo = consejo.getCdeDescripcion();
            String abrevConsejo = consejo.getCdeAbreviatura();
            consejo = null;
            delegadoConsejo = null;
            Preevento preevento = new Preevento();
            PreEventoDelegate delegadoPreevento = new PreEventoDelegate();
            codigoEvento = (codigoEvento != null) ? codigoEvento : 0;
            preevento = delegadoPreevento.findID(codigoEvento);
            String nombreCurso = (preevento != null) ? preevento.getPreNombre() : "<Seleccione nombre del curso>";
            preevento = null;
            delegadoPreevento = null;
            Map parametros = new HashMap();
            parametros.put("nombreConsejo", nombreConsejo);
            parametros.put("abrevConsejo", abrevConsejo);
            parametros.put("logoReporte", logoReporte);
            parametros.put("nombreCurso", nombreCurso);
            parametros.put("notaMinima", notaMinima);
            File entrada = new File(rutaJasper);
            JasperPrint print = JasperFillManager.fillReport(new FileInputStream(entrada), parametros, new JRBeanCollectionDataSource(listaMatricula));
            if (ruta.generarPDF(rutaPDF, print)) {}
        } catch (Exception e) {
            System.out.println("-------" + e.toString());
        }
        return "";
    }

    public SelectItem[] getComboCursos() {
        try {
            PreEventoDelegate delegadoPreevento = new PreEventoDelegate();
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            List<Preevento> listaCursos = delegadoPreevento.listarCursos();
            delegadoPreevento = null;
            selects = new SelectItem[listaCursos.size()];
            int cont = 0;
            for (Preevento preevento : listaCursos) {
                SelectItem item = new SelectItem(preevento.getPreCodigo(), preevento.getPreNombre());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen cursos");
            selects[0] = item;
            return selects;
        }
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

}
